# 定义源文件、头文件和库文件目录
SRC_DIR := src
INCLUDE_DIR := include
LIB_DIR := lib

# 使用shell命令递归查找源文件和头文件
SOURCES := $(shell find $(SRC_DIR) -type f -name '*.c')
HEADERS := $(shell find $(INCLUDE_DIR) -type f -name '*.h')

# 从源文件列表生成对象文件列表
OBJS := $(patsubst %.c, %.o, $(SOURCES))

# 从头文件目录生成包含路径列表
INCLUDE_DIRS := $(shell find $(INCLUDE_DIR) -type d)
INCLUDE_FLAGS := $(addprefix -I, $(INCLUDE_DIRS))

# 定义编译器和编译选项
CC := gcc
CFLAGS := $(INCLUDE_FLAGS) -Wall -g -lpthread -std=c99 -D_SVID_SOURCE
LDFLAGS := -L$(LIB_DIR) -Wl,-rpath=$(LIB_DIR)  # 设置库路径和运行时库路径

# 定义目标文件
TARGET := server.out

# 查找lib目录下的所有.so和.a文件，并生成链接库选项
SO_LIBS := $(shell find $(LIB_DIR) -name '*.so')
A_LIBS := $(shell find $(LIB_DIR) -name '*.a')
LIB_FLAGS := $(patsubst $(LIB_DIR)/lib%.so,-l%, $(SO_LIBS)) $(patsubst $(LIB_DIR)/lib%.a,-l%, $(A_LIBS))

# 规则：编译目标文件
$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIB_FLAGS)
	rm -f $(OBJS)

# 规则：编译源文件
%.o: %.c $(HEADERS)
	$(CC) $(CFLAGS) -c $< -o $@

# 规则：清理生成的文件
.PHONY: clean
clean:
	rm -f $(OBJS) $(TARGET)

# 规则：重新构建
.PHONY: rebuild
rebuild: clean $(TARGET)

# 打印源文件、头文件和包含路径列表（可选）
.PHONY: print_files
print_files:
	@echo "Sources: $(SOURCES)"
	@echo "Headers: $(HEADERS)"
	@echo "Include Flags: $(INCLUDE_FLAGS)"
	@echo "Library Flags: $(LIB_FLAGS)"
